#include <iostream>
using namespace std;

//初始化成员列表
//由逗号分隔的初始化列表组成
//位于参数列表的右括号之后、函数体左括号之前
//如果数据成员的名称为mdata，并需要将它初始化为val，则初始化器为mdata(val)
class Box
{
private:
    int _len; // 长度
    int _w; // 宽度
    int _h; // 高度
    int& p; // 引用(必须初始化，此时应使用初始化成员列表,对所有构造函数进行初始化)
    const int sum; // const修饰的常量成员变量，也必须用初始化成员列表进行初始化
    //类中的成员变量，是另一个类中的实例化对象，也会用到初始化成员列表进行初始化，来绕过无参构造函数的调用，运用于实际的工程化多人工作中。

public:
    // 构造函数
    Box():p(_len),sum(100)
    {
        cout <<"Box()" << endl;
        _w = _h = _len  = 10;  //对成员变量进行初始化
    }

    Box(int len, int w, int h):_len(len), _w(w), _h(h),p(_len),sum(100)
    {
        cout << "Box Constructor called." << endl;
    }
    int get_len(){return _len;}
    int get_w(){return _w;}
    int get_h(){return _h;}

};

int main()
{
    Box b3(100, 20, 30);
    cout << "b3 len: " << b3.get_len() << endl;
    cout << "b3 w: " << b3.get_w() << endl;
    cout << "b3 h: " << b3.get_h() << endl;

    return 0;
}
/*
构造函数总结：
1、构造一个对象一定会自动调用一个构造函数。
2、如果一个类中没有实现默认构造函数，编译器会自动生成一个，前提是没有实现带参数的构造函数。
3、如果一个类中实现了带参数的构造函数，一定要实现一个无参的构造函数，因为在构造对象时不带参数
将无法找到无参的构造函数，导致错误。
4、构造函数可以有多个，根据构造对象的所传递的参数，会自动调用对应的构造函数。
5、类不会占用程序的内存空间，对象才会占用程序的内存空间。
*/